// 封装axios
// 引入axios和qs
import axios from "axios";
import Qs from "qs";
// 导入vant 提示插件
import { Toast } from "vant";

// 配置跨域
axios.defaults.withCredentials = true; //false  不跨域  true 跨域
axios.defaults.headers.common["token"] = localStorage.getItem("token"); //设置请求头，这个不是必须的

// 导出
export default function(path, params, method = "GET", headerType = "json") {
  // 在vue.config.js中配置了代理 用/api代理https://api.ymduo.com目标服务器
  let baseURL = "/api";
  let data = {};

  // baseUrl = process.env.BASE_URL; ////这里是在config里面配置了请求路径
  // 请求头设置
  if (method === "post") {
    // post请求方式
    if (headerType == "json") {
      // headerType是json  默认不传为json
      axios.defaults.headers.post["Content-Type"] = "application/json;charset=UTF-8";
      // 设置请求头
      data = params;
      // 将传入的params赋值给post请求需要的data
      // console.log(data);
    } else {
      // headerType不是json
      axios.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded";
      // 设置常用请求头
      data = Qs.stringify(params);
      // 将传入的params经过qs模块处理赋值给data
      // console.log(data);
    }
  }
  if (method === "get") {
    // get请求方式
    if (headerType == !"json") {
      // 请求头类型不是json
      axios.defaults.headers["Content-Type"] = "application/x-www-form-urlencoded;charset=UTF-8";
      // 设置常用请求头
    }
    data = Qs.stringify(params);
    path = path + "?" + data;
    data = {};
  }
  //请求拦截器
  // 通过token进行拦截
  axios.interceptors.request.use(
    function(config) {
      let token = localStorage.getItem("token");
      if (token) {
        // 如果有token 把token 携带到每个请求的请求头
        config.headers["token"] = token;
      }
      return config;
    },
    function(error) {
      return Promise.reject(error);
    }
  );
  // 响应拦截器
  // 通过状态值进行拦截
  axios.interceptors.response.use(
    response => {
      if (response.headers.token) {
        localStorage.setItem("token", response.headers.token);
      }
      if (response.data.code == 0) {
        Toast.fail("暂无数据");
      }
      if (response.data.code == 200001) {
        Toast.fail("登录过期，重新登录");
      }
      return response;
    },
    err => {
      return Promise.reject(err.response);
    }
  );
    // 返回值  返回一个新的Promise对象 并将axios放入这个Promise对象中
  return new Promise((resolve, reject) => {
    axios({
      baseURL,
      method,
      url: path,
      data,
      timeout: 6000
    })
      .then(res => {
        // 成功返回data
        resolve(res.data);
      })
      .catch(err => {
        // 失败抛出错误
        reject(err);
      });
  });
}
